import { ref, toRaw, watch } from 'vue';
import { ElMessage } from 'element-plus';
/**
 * 对话列表管理Hook
 * 作用：用于管理对话列表的增删改查
 * 注意事项：由于使用的是localStorage，存储空间有限，而保存的内容通常较多，特别是使用了RAG的情况下，数据超出上限可能导致数据丢失或程序报错，
 * 如果需要保存更多内容，建议自行改为通过数据库进行存储读取。
 */

function useChatList() {
    // 对话总列表
    let data = ref([]);
    // 当前对话ID
    let currentId = ref(null);
    // 当前对话内容
    let currentMessage = ref(null);
    // 当前选择的模型
    let currentModel = ref(null);
    // 当前选择的提示词
    let currentPrompt = ref(null);
    // 当前自定义提示词
    let currentCustomPrompt = ref(null);

    // 存储聊天列表
    const set = () => {
        try {
            localStorage.setItem('chatlist', JSON.stringify(data.value));
        } catch (error) {
            console.error('存储聊天列表失败', error);
        }
    }
    // 获取聊天列表
    const get = () => {
        const chatlistStr = localStorage.getItem('chatlist');
        // 判断缓存是否有对话列表
        if (chatlistStr) {
            // 有则取出最新一条消息作为当前聊天内容
            data.value = JSON.parse(chatlistStr);
            let lastMessage = data.value[data.value.length-1]
            currentId.value = lastMessage.id
            currentMessage.value = lastMessage.message
            currentModel.value = lastMessage.model
            currentPrompt.value = lastMessage.prompt
            currentCustomPrompt.value = lastMessage.customPrompt
        }else{
            // 无则代表第一次打开，没有聊天列表，初始化一个空列表
            currentId.value = Date.now()
            let message = [{id:currentId.value,message:toRaw(data.value)}]
            localStorage.setItem('chatlist', JSON.stringify(message));
            // 重新执行函数，配置对话内容
            get()
        }
    }

    // 赋值聊天列表
    const setData = (model, prompt , customPrompt , list) => {
        // 判断当前对话ID是否存在于总列表中，不存在则新增，存在则更新对话内容
        let index = data.value.findIndex(item => item.id === currentId.value)
        data.value[index].message = list
        data.value[index].model = model
        data.value[index].prompt = prompt
        data.value[index].customPrompt = customPrompt
    }

    // 新增对话
    const add = (list = []) => {
        // 限制新增对话数量
        if(data.value.length>=10){
            ElMessage.error('最多只能添加10个对话')
        }else{
            // 重新获取对话ID新增到总列表中，并设置当前对话ID和内容
            currentId.value = Date.now()
            let message = {id:currentId.value,message:toRaw(list)}
            data.value.push(message)
            currentMessage.value = data.value[data.value.length-1].message
            return currentId.value
        }
    }

    // 切换对话
    const switchChat = (id) => {
        // 设置当前对话ID，并从总列表中获取当前对话内容
        currentId.value = id
        let index = data.value.findIndex(item => item.id === id)
        currentMessage.value = data.value[index].message
        currentModel.value = data.value[index].model
        currentPrompt.value = data.value[index].prompt
        currentCustomPrompt.value = data.value[index].customPrompt
    }

    // 删除对话
    const remove = (id) => {
        // 从总列表中删除指定对话，并设置当前对话ID和内容为最新一条
        let index = data.value.findIndex(item => item.id === id)
        data.value.splice(index,1)
        currentId.value = data.value[data.value.length-1].id
        currentMessage.value = data.value[data.value.length-1].message
    }

    // 清空对话
    const clear = () => {
        // 清空总列表，删除本地缓存，设置当前对话ID和内容为空
        data.value = []
        localStorage.removeItem('chatlist')
        currentId.value = null
        currentMessage.value = null
        // 重新执行获取函数，初始化聊天列表（模拟第一次进入该应用）
        get()
    }

    // 监听聊天列表变化，存储到本地
    watch(()=>data,()=> set() ,{deep:true})

    // 初始化聊天列表
    get();

    return {
        data,
        currentId,
        currentMessage,
        currentModel,
        currentPrompt,
        currentCustomPrompt,
        setData,
        add,
        get,
        set,
        switchChat,
        remove,
        clear
    }
}

export default useChatList